package com.changan.utils;

import com.changan.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @program: xg-parent
 * @description: 构建树形菜单的工具类
 * @author: Mr.Nie
 * @create: 2022-03-03 10:25
 **/
public class MenuTreeBuilder {

    /**
     * 功能描述: <br>
     * 〈构建菜单树〉
     * @Param: [rootMenu]
     * @Return: java.util.List<com.changan.entity.Menu>
     * @Author: Mr.Nie
     * @Date: 2022/3/3 10:28
     */
    public static List<Menu> build(List<Menu> rootMenu){
        //2.查看一下有没有获取到菜单
        rootMenu.forEach(menu -> {
            System.out.println(menu.toString());
        });
        //3.定义一个最后的结果来存储菜单树
        List<Menu> menuList = new ArrayList<>();
        //4.先查询一级菜单
        for (Menu menu : rootMenu){
            //如果getParentId为0说明这是父级菜单
            if(menu.getParentId()==0){
                //将父级菜单添加到menuList中
                menuList.add(menu);
            }
        }

        //对一级菜单进行排序
        Collections.sort(menuList,Menu.order());

        //5.为一级菜单设置子菜单
        for(Menu menu : menuList){
            //这里需要通过递归的方法去设置子菜单(因为子菜单中可能还有子菜单)
            menu.setChildMenus(getChild(menu.getId(), rootMenu));
        }
        return menuList;
    }



    /**
     * 功能描述: <br>
     * 〈递归获取子菜单〉
     * @Param: [id 父级id, rootMenu 所有的菜单列表]
     * @Return: java.util.List<com.changan.entity.Menu>
     * @Author: Mr.Nie
     * @Date: 2022/3/3 10:28
     */
    private static List<Menu> getChild(Long id, List<Menu> rootMenu) {
        // 子菜单
        List<Menu> childList = new ArrayList<>();
        //1.如何判断一个菜单是另一个菜单的子菜单
        //1.该菜单的父级id必须是id,不能是按钮
        for (Menu menu : rootMenu) {
            //说明该菜单就是我们id的子菜单
            if(menu.getParentId().equals(id)&&menu.getType().equals("0")){
                childList.add(menu);
            }
        }

        //这里设置二级以上的菜单(最多是三级菜单)
        for (Menu menu : childList){
            menu.setChildMenus(getChild(menu.getId(),rootMenu));
        }

        //对子级菜单进行排序
        Collections.sort(childList,Menu.order());

        //判断递归结束的条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }
}
